"""
用户管理相关 API 路由
提供用户查询和更新功能
"""
from typing import List
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from app.core.database import get_db
from app.schemas.user import UserResponse, UserUpdate
from app.models.user import User
from app.api.dependencies import get_current_user
from app.utils.exceptions import NotFoundException, BadRequestException

router = APIRouter(prefix="/users", tags=["用户"])


@router.get("/", response_model=List[UserResponse])
async def get_users(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
    """
    获取用户列表（分页）
    
    Args:
        skip: 跳过的记录数，用于分页
        limit: 返回的最大记录数，默认100
        db: 数据库会话
        
    Returns:
        List[UserResponse]: 用户列表
    """
    users = db.query(User).offset(skip).limit(limit).all()
    return users


@router.get("/{user_id}", response_model=UserResponse)
async def get_user(user_id: int, db: Session = Depends(get_db)):
    """
    根据用户ID获取单个用户信息
    
    Args:
        user_id: 用户ID
        db: 数据库会话
        
    Returns:
        UserResponse: 用户信息
        
    Raises:
        NotFoundException: 用户不存在时抛出
    """
    user = db.query(User).filter(User.id == user_id).first()
    if not user:
        raise NotFoundException("用户不存在")
    return user


@router.put("/me", response_model=UserResponse)
async def update_current_user(
    user_update: UserUpdate,
    current_user: User = Depends(get_current_user),
    db: Session = Depends(get_db)
):
    """
    更新当前登录用户的信息
    需要携带有效的 JWT 令牌才能访问
    可以更新用户名、邮箱和密码（所有字段都是可选的）
    
    Args:
        user_update: 用户更新数据，只包含需要更新的字段
        current_user: 当前登录用户对象
        db: 数据库会话
        
    Returns:
        UserResponse: 更新后的用户信息
        
    Raises:
        BadRequestException: 用户名或邮箱已被使用时抛出
    """
    # 更新用户名（如果提供且与当前不同）
    if user_update.username and user_update.username != current_user.username:
        if db.query(User).filter(User.username == user_update.username).first():
            raise BadRequestException("用户名已存在")
        current_user.username = user_update.username
    
    # 更新邮箱（如果提供且与当前不同）
    if user_update.email and user_update.email != current_user.email:
        if db.query(User).filter(User.email == user_update.email).first():
            raise BadRequestException("邮箱已被使用")
        current_user.email = user_update.email
    
    # 更新密码（如果提供）
    if user_update.password:
        from app.core.security import get_password_hash
        current_user.hashed_password = get_password_hash(user_update.password)
    
    # 提交更改并刷新对象
    db.commit()
    db.refresh(current_user)
    return current_user


